Windows api 控制台操作:取消最大化、最小化、关闭菜单 您所在的位置:网站首页 windows 菜单栏 取消隐藏 Windows api 控制台操作:取消最大化、最小化、关闭菜单

Windows api 控制台操作:取消最大化、最小化、关闭菜单

2023-10-16 11:07| 来源: 网络整理| 查看: 265

主要步骤:

找到窗口句柄删除对应菜单选项

相关函数:

获得窗口句柄-GetConsoleWindow

GetConsoleWindow是检索与调用进程相关联的控制台窗口句柄的意思

复制或修改而访问窗口菜单-GetSystemMenu

窗口菜单指“最大化”、“最小化”、“关闭”等按钮 参数:

hWnd:拥有窗口菜单拷贝的窗口的句柄。 bRevert:标志位,指定将执行的操作。

返回值:

如果参数bRevert为FALSE,返回值是窗口菜单的拷贝的句柄 如果参数bRevert为TRUE,返回值是NULL

移除菜单项-RemoveMenu

参数:

hMenu:将被修改的菜单的句柄。 UPosition:指定将被删除的菜单项,其含义由参数uFlags决定。 uFlags:指定参数uPosition如何解释。此参数必须为下列之一值:

返回值:如果函数调用成功,返回非零值;如果函数调用失败,返回值是零。若想获得更多的错误信息,请调用GetLastError函数。

注:DeleteMenu跟RemoveMenu得区别,前者是彻底的删除,后者只是移除,不会销毁菜单或它的句柄

重新绘制菜单栏-DrawMenuBar

说明

为指定的窗口重画菜单。使用api函数改变一个窗口菜单的内容后,需要用到这个函数

返回值

Long,非零-成功,零-失败。会设置GetLastError

示例一:禁用最大化按钮

#include int main() { HWND hwnd = GetConsoleWindow(); // 获得控制台句柄 HMENU hmenu = GetSystemMenu(hwnd, false); // 复制或修改而访问窗口菜单 RemoveMenu(hmenu, SC_MAXIMIZE, MF_BYCOMMAND); // 从指定菜单删除一个菜单项或分离一个子菜单 DrawMenuBar(hwnd); return 0; }

运行结果:虽然右上角的最大化按钮还在,但是点击后无效果。而左上角的弹出菜单中也没有最大化的选项。 在这里插入图片描述 可以看到用 GetSystemMenu 移除菜单按钮后,按钮依然会展示出来,但实际上是被禁用了。

如果我们使用 GetSystemMenu 来禁用关闭时,关闭按钮在禁用的同时会变成灰色。

#include int main() { HWND hwnd = GetConsoleWindow(); HMENU hmenu = GetSystemMenu(hwnd, false); RemoveMenu(hmenu, SC_CLOSE/* 关闭菜单 */, MF_BYCOMMAND); DrawMenuBar(hwnd); return 0; }

注:这里可以使用 alt+F4 关闭当前窗口 在这里插入图片描述 RemoveMenu可支持的其他菜单选项:

/* * System Menu Command Values */ #define SC_SIZE 0xF000 #define SC_MOVE 0xF010 #define SC_MINIMIZE 0xF020 #define SC_MAXIMIZE 0xF030 #define SC_NEXTWINDOW 0xF040 #define SC_PREVWINDOW 0xF050 #define SC_CLOSE 0xF060 #define SC_VSCROLL 0xF070 #define SC_HSCROLL 0xF080 #define SC_MOUSEMENU 0xF090 #define SC_KEYMENU 0xF100 #define SC_ARRANGE 0xF110 #define SC_RESTORE 0xF120 #define SC_TASKLIST 0xF130 #define SC_SCREENSAVE 0xF140 #define SC_HOTKEY 0xF150

示例二:使用 SetWindowLong 禁用最大化按钮

SetWindowLong 函数可以用来改变指定窗口的属性,而有一个属性为GWL_STYLE用于设定窗口风格。

关于SetWindowLong https://baike.baidu.com/item/SetWindowLong

#include int main() { HWND hwnd = GetConsoleWindow(); LONG style = GetWindowLong(hwnd, GWL_STYLE); // GWL_STYLE -16 设定一个新的窗口风格。 style &= ~(WS_MAXIMIZEBOX); // 取消最大化按钮显示 SetWindowLong(hwnd, GWL_STYLE, style); // 设置窗口属性 return 0; }

运行效果:最大化按钮变为灰色,且点击无效。 在这里插入图片描述 除此之外,窗口风格这里还支持其他属性:

/* * Window Styles */ #define WS_OVERLAPPED 0x00000000L #define WS_POPUP 0x80000000L #define WS_CHILD 0x40000000L #define WS_MINIMIZE 0x20000000L #define WS_VISIBLE 0x10000000L #define WS_DISABLED 0x08000000L #define WS_CLIPSIBLINGS 0x04000000L #define WS_CLIPCHILDREN 0x02000000L #define WS_MAXIMIZE 0x01000000L #define WS_CAPTION 0x00C00000L /* WS_BORDER | WS_DLGFRAME */ #define WS_BORDER 0x00800000L #define WS_DLGFRAME 0x00400000L #define WS_VSCROLL 0x00200000L #define WS_HSCROLL 0x00100000L #define WS_SYSMENU 0x00080000L #define WS_THICKFRAME 0x00040000L #define WS_GROUP 0x00020000L #define WS_TABSTOP 0x00010000L #define WS_MINIMIZEBOX 0x00020000L #define WS_MAXIMIZEBOX 0x00010000L #define WS_TILED WS_OVERLAPPED #define WS_ICONIC WS_MINIMIZE #define WS_SIZEBOX WS_THICKFRAME #define WS_TILEDWINDOW WS_OVERLAPPEDWINDOW

WS_SIZEBOX:不能调整大小(最大化依然生效) 在这里插入图片描述

WS_CAPTION:取消菜单按钮 在这里插入图片描述

WS_TILEDWINDOW:取消菜单栏 在这里插入图片描述



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有